import java.util.Arrays;

public class Main {
    /**
     * Move non-zero elements
     * 把数组中的0元素移动到数组末尾
     * */
    public static void number(int[] arr){
//        for(int dest=-1,cur=0;cur<arr.length;cur++){
//            if(arr[cur]!=0){
//                dest++;
//                int temp=arr[cur];
//                arr[cur]=arr[dest];
//                arr[dest]=temp;
//            }
//        }
        int dest=-1;
        int cur=0;
        for(int i=0;i<arr.length;i++){
            if(arr[cur]==0){
                cur++;
            }else{
                //++dest;
                int temp=arr[cur];
                arr[cur]=arr[dest+1];
                arr[dest+1]=temp;
                cur++;
                dest++;
            }
        }
    }
    public static void main(String[] args) {
        int[] arr = {1,2,0,5,0,8,7,7,3};
        //测试移动零
        //number(arr);
        //System.out.println(Arrays.toString(arr));


        //测试0的复写
        System.out.println(Arrays.toString(Reproduction1(arr)));
    }

    /**
     * 把数组中的所有0都复写一遍
     * */
    public static int[] Reproduction(int[] arr){
        //异地操作写法
        int[] Newarrays=new int[arr.length];
        int cur=0;
        for(int i=0;i<arr.length;i++){
            if(arr[i]==0){
                Newarrays[cur++]=arr[i];
                Newarrays[cur++]=arr[i];
            }else{
                Newarrays[cur++]=arr[i];
            }
            if(cur==arr.length){
                break;
            }
        }
        return Newarrays;
    }


    public static int[] Reproduction1(int[] arr){
        //本地当前数组操作算法
        //1：找复写到最后要复写的数
        int dest=-1;
        int cur=0;
        int n=arr.length;
        for(int i=0;i<arr.length;i++){
            if(arr[i]!=0){
                dest++;
            }else{
                dest+=2;
            }
            if(dest>=n-1){
                break;
            }
            cur++;
        }
        //处理越界后的情况
        if(dest==n){
            arr[n-1]=0;
            cur--;
            dest-=2;
        }
        //反向进行复写操作
        while(cur>=0){
            if(arr[cur]!=0){
                arr[dest--]=arr[cur--];
            }else{
                arr[dest--]=0;
                arr[dest--]=0;
                cur--;
            }
        }
        return arr;
    }
}
